package com.efast.dmom.mgmt.service.mes;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.efast.cafe.framework.bean.ResultBean;
import com.efast.dmom.mgmt.bean.mes.order.OrderCancelBean;
import com.efast.dmom.mgmt.bean.mes.order.RecycledVinBean;
import com.efast.dmom.mgmt.bean.mes.order.WorkOrderItem;
import com.efast.dmom.mgmt.entity.mes.TwBasLot;
import com.efast.dmom.mgmt.entity.mes.TwBasWorkOrder;
import com.efast.dmom.mgmt.utils.Assist;


public interface TwBasWorkOrderService {
	/**
	 * 获得TwBasWorkOrder数据的总行数,可以通过辅助工具Assist进行条件查询,如果没有条件则传入null
	 * 
	 * @param assist
	 * @return
	 */
	long getTwBasWorkOrderRowCount(Assist assist);

	/**
	 * 获得TwBasWorkOrder数据集合,可以通过辅助工具Assist进行条件查询,如果没有条件则传入null
	 * 
	 * @param assist
	 * @return
	 */
	List<TwBasWorkOrder> selectTwBasWorkOrder(Assist assist);

	/**
	 * 获得一个TwBasWorkOrder对象,以参数TwBasWorkOrder对象中不为空的属性作为条件进行查询
	 * 
	 * @param obj
	 * @return
	 */
	TwBasWorkOrder selectTwBasWorkOrderByObj(TwBasWorkOrder obj);

	/**
	 * 通过TwBasWorkOrder的id获得TwBasWorkOrder对象
	 * 
	 * @param id
	 * @return
	 */
	TwBasWorkOrder selectTwBasWorkOrderById(Integer id);

	/**
	 * 插入TwBasWorkOrder到数据库,包括null值
	 * 
	 * @param value
	 * @return
	 */
	int insertTwBasWorkOrder(TwBasWorkOrder value);
	
	void insertWorkItem(List<WorkOrderItem> itemList);
	
	List<WorkOrderItem> getWorkOrderItem(TwBasWorkOrder workOrder);
	
	Map<Date, Integer> getCapacityInfo(int planId);

	/**
	 * 插入TwBasWorkOrder中属性值不为null的数据到数据库
	 * 
	 * @param value
	 * @return
	 */
	int insertNonEmptyTwBasWorkOrder(TwBasWorkOrder value);

	/**
	 * 批量插入TwBasWorkOrder到数据库
	 * 
	 * @param value
	 * @return
	 */
	int insertTwBasWorkOrderByBatch(List<TwBasWorkOrder> value);

	/**
	 * 通过TwBasWorkOrder的id删除TwBasWorkOrder
	 * 
	 * @param id
	 * @return
	 */
	int deleteTwBasWorkOrderById(Integer id);

	/**
	 * 通过辅助工具Assist的条件删除TwBasWorkOrder
	 * 
	 * @param assist
	 * @return
	 */
	int deleteTwBasWorkOrder(Assist assist);

	/**
	 * 通过TwBasWorkOrder的id更新TwBasWorkOrder中的数据,包括null值
	 * 
	 * @param enti
	 * @return
	 */
	int updateTwBasWorkOrderById(TwBasWorkOrder enti);

	/**
	 * 通过辅助工具Assist的条件更新TwBasWorkOrder中的数据,包括null值
	 * 
	 * @param value
	 * @param assist
	 * @return
	 */
	int updateTwBasWorkOrder(TwBasWorkOrder value, Assist assist);

	/**
	 * 通过TwBasWorkOrder的id更新TwBasWorkOrder中属性不为null的数据
	 * 
	 * @param enti
	 * @return
	 */
	int updateNonEmptyTwBasWorkOrderById(TwBasWorkOrder enti);

	/**
	 * 通过辅助工具Assist的条件更新TwBasWorkOrder中属性不为null的数据
	 * 
	 * @param value
	 * @param assist
	 * @return
	 */
	int updateNonEmptyTwBasWorkOrder(TwBasWorkOrder value, Assist assist);

	/**
	 * 拆分工单
	 * 
	 * @param id
	 * @param splitQty
	 * @param splitBatch
	 */
	void splitWorkOrder(Integer id, Double splitQty, Integer splitBatch);

    /**
     * 关闭工单
     * 
     * @param closeReason
     * @param pwd
     * @param workOrder
     * @return
     */
	ResultBean closeWorkOrder(String closeReason, String pwd, List<TwBasWorkOrder> workOrder);

	/**
	 * 合并工单
	 * 
	 * @param id
	 * @param no
	 */
	int mergeWorkOrder(int id, String no);

	/**
	 * 获取所有工单单号
	 * 
	 * @return
	 */
	String[] getAllOrderNum();

	/**
	 * 获取产品定义中对应零件的产线及所有主数据中的产线
	 * 
	 * @param partNo
	 * @return
	 */
	Map<Object, Object> getAllProLines(List<TwBasWorkOrder> twBasWorkOrder);

	/**
	 * 发布工单
	 * 
	 * @param id
	 * @param productLine
	 */
	void releaseWorkOrder(List<TwBasWorkOrder> twBasWorkOrder);

	/**
	 * 产品序号生成
	 * 
	 * @param orderId
	 * @param lotQty
	 */
	void insertTwBasLot(List<TwBasWorkOrder> twBasWorkOrder);
	
	/**
	 * 产品序号手动生成
	 * 
	 * @param orderId
	 * @param lotQty
	 */
	void insertManualTwBasLot(Integer orderId, Integer lotQty,String lotName);

	/**
	 * 产品包装页面通过工单号获取工单信息
	 * 
	 * @param orderNumber
	 * @return
	 */
	Map<String, Object> getWorkOrderInfo(String orderNumber);

	/**
	 * 插入一个List
	 * @param twBasWorkOrders
	 */
	void insertTwBasWorkOrderList(List<TwBasWorkOrder> twBasWorkOrders);
	
	/**
	 * 按周获取工单总量（从当前周往前5周）
	 * @return
	 */
	Map<String, Object> getOrderCount();

	/**
	 * 货车过点时没有VIN的订单补VIN
	 */
	void replenishVin();

	/**
	 * 
	 * @param twBasWorkOrders
	 * @return 工单冻结
	 */
	ResultBean workOrderFreeze(List<TwBasWorkOrder> twBasWorkOrders);

	/**
	 * 
	 * @param twBasWorkOrders
	 * @return 工单解冻
	 */
	ResultBean workOrderThaw(List<TwBasWorkOrder> twBasWorkOrders);
	
	void vechicleScrap(List<RecycledVinBean> beanList);

	void holdLotInBatch(List<TwBasLot> lotList);
	
	void fixVinInBatch(List<TwBasLot> lotList);
	
	void removeCachedRecycleBean(List<RecycledVinBean> vinList);
	/**
	 * 订单取消
	 * @param twBasWorkOrders
	 * @return 
	 */
	ResultBean orderCancel(List<TwBasWorkOrder> twBasWorkOrders);

	/**
	 * 已完工订单的取消
	 * @param orderCancelBean
	 */
	ResultBean orderCompletedCancel(OrderCancelBean orderCancelBean);

	/**
	 * 已生成VIN的订单取消
	 * @param workOrderItem
	 * @return
	 */
	ResultBean orderOnlineCancel(List<WorkOrderItem> workOrderItem);

}